// Package app 提供应用程序级别的功能
package app

import (
	"fmt"
	"os"
	"os/signal"
	"sync"
	"syscall"

	"github.com/chzyer/readline"
)

// SignalManager 信号管理器
type SignalManager struct {
	sigChan   chan os.Signal
	callbacks []func()
	once      sync.Once
	mu        sync.RWMutex
}

// NewSignalManager 创建新的信号管理器
func NewSignalManager() *SignalManager {
	sm := &SignalManager{
		sigChan:   make(chan os.Signal, 1),
		callbacks: make([]func(), 0),
	}

	// 注册信号监听
	signal.Notify(sm.sigChan, syscall.SIGINT, syscall.SIGTERM)

	return sm
}

// AddCallback 添加退出回调函数
func (sm *SignalManager) AddCallback(callback func()) {
	sm.mu.Lock()
	defer sm.mu.Unlock()
	sm.callbacks = append(sm.callbacks, callback)
}

// Start 启动信号监听（只能启动一次）
func (sm *SignalManager) Start() {
	sm.once.Do(func() {
		go sm.handleSignals()
	})
}

// handleSignals 处理信号
func (sm *SignalManager) handleSignals() {
	<-sm.sigChan
	fmt.Println("\n\n程序正在退出...")

	// 执行所有回调函数
	sm.mu.RLock()
	for _, callback := range sm.callbacks {
		if callback != nil {
			callback()
		}
	}
	sm.mu.RUnlock()

	os.Exit(0)
}

// SetupWithReadline 为readline设置信号处理
func (sm *SignalManager) SetupWithReadline(rl *readline.Instance) {
	sm.AddCallback(func() {
		if rl != nil {
			rl.Close()
		}
	})
	sm.Start()
}
